package br.com.gsa.bean;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.faces.model.SelectItem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import br.com.gsa.enun.TipoContatoEnun;
import br.com.gsa.model.Cliente;
import br.com.gsa.model.ContatoCliente;
import br.com.gsa.model.Endereco;
import br.com.gsa.model.Uf;
import br.com.gsa.service.ClienteService;
import br.com.gsa.service.UfService;
import br.com.gsa.util.Constantes;
import br.com.gsa.util.Mensagem;

@Controller("clienteBean")
@Scope("request")
public class ClienteBean extends BaseView {
	
	
	private static final long serialVersionUID = 3068528635817656557L;

	private Cliente cliente;
	
	@Autowired
	private ClienteService clienteService;
	
	@Autowired
	private UfService ufService;
	
	private List<Cliente> clientes;
	private List<TipoContatoEnun> listTipoContato;
	private List<ContatoCliente> listContatos;
	
	private ContatoCliente contatoCliente;

	private Long idCliente;
	
	private String tipoContato;
	
	private String tipoCliente;
	
	private List<Uf> listUfs;
	
	private Uf ufSelecionada;
	
	private Endereco endereco;
	
	private List<SelectItem> listaUfs; 
	
	private String uf;
	
	public void salvarCliente(){
		List<Endereco> enderecos = new ArrayList<Endereco>();
		if(cliente.getStatus()!=null && cliente.getStatus().equals(Constantes.STATUS_UPDATE)){
			cliente.setContatos(listContatos);	
			this.endereco.setUf(obterUf(uf));
			enderecos.add(endereco);
			cliente.setEnderecos(enderecos);
			if(cliente.getTipoCliente().equals("1"))
				cliente.setCnpj(null);
			else
				cliente.setCpf(null);
			
			clienteService.update(cliente);
		}else{
		//	this.endereco.setUf(obterUf(uf));
			enderecos.add(endereco);
			cliente.setEnderecos(enderecos);
			cliente.setContatos(listContatos);

			clienteService.save(cliente);
		}
			limpar();
	}
	
	
	private Uf obterUf(String uf) {
		 return ufService.findById(Long.valueOf(uf));
	}


	public List<ContatoCliente> atualizarContatosEdicao(List<ContatoCliente> list){
		list.clear();
		for(ContatoCliente contato: listContatos){
			list.add(contato);
		}
		
		return list;
	}
	
	public void limpar(){
		listContatos = new ArrayList<ContatoCliente>();
		cliente = new Cliente();
		contatoCliente = new ContatoCliente();
		listTipoContato = new ArrayList<TipoContatoEnun>();
	}
	
	public void removerContato(){
		listContatos.remove(contatoCliente);
		contatoCliente = new ContatoCliente();
	}
	
	public void addContato(){
		
		if(contatoCliente != null){
			
			if(tipoContato == "" || contatoCliente.getContato() == ""){
				if(tipoContato == "" )
					Mensagem.infoMsg("informe.tipoContato");
				if(contatoCliente.getContato() == "")
					Mensagem.infoMsg("informe.contato");
			}
			else{			
				contatoCliente.setTipoContato(tipoContato);
				if(TipoContatoEnun.TELEFONE_CELULAR.getCodigo().equals(tipoContato))
					contatoCliente.setDescricaoTipoContato(TipoContatoEnun.TELEFONE_CELULAR.getDescricao());
				else
					if(TipoContatoEnun.TELEFONE_RESIDENCIAL.getCodigo().equals(tipoContato))
						contatoCliente.setDescricaoTipoContato(TipoContatoEnun.TELEFONE_RESIDENCIAL.getDescricao());
				listContatos.add(contatoCliente);
			}
		}
	}

	public void excluir(){
		clienteService.deleteById(idCliente);
	}
	
	
	public ContatoCliente getContatoCliente() {
		if(contatoCliente == null)
			contatoCliente = new ContatoCliente();
		
		return contatoCliente;
	}

	public void editar(){
		cliente.setStatus(Constantes.STATUS_UPDATE);
		if(cliente.getCnpj() != null)
			cliente.setTipoCliente("2");
		else
			if(cliente.getCpf() != null)
				cliente.setTipoCliente("1");
		carregarContatos();
		carregarEndereco();
	}
	
	public void carregarContatos(){
		for(ContatoCliente contatoCliente: cliente.getContatos()){
			contatoCliente.setDescricaoTipoContato(obtemDescricaoContato(contatoCliente.getTipoContato()));
			listContatos.add(contatoCliente);
		}
		
	}
	
	
	private void carregarEndereco(){
		
		if(cliente.getEnderecos() != null && cliente.getEnderecos().size() > 1 ){
			this.endereco.setBairro(cliente.getEnderecos().get(0).getBairro());
			this.endereco.setCep(cliente.getEnderecos().get(0).getCep());
			this.endereco.setCidade(cliente.getEnderecos().get(0).getCidade());
			this.endereco.setComplemento(cliente.getEnderecos().get(0).getComplemento());
			this.endereco.setLogradouro(cliente.getEnderecos().get(0).getLogradouro());
			this.endereco.setNumero(cliente.getEnderecos().get(0).getNumero());
			uf = String.valueOf(cliente.getEnderecos().get(0).getUf().getCodPais());
		}
		
	}
	
	private String obtemDescricaoContato(String codigoContato) {
		String descricao = "";
		for(TipoContatoEnun tipoContato: TipoContatoEnun.values()){
			if(tipoContato.getCodigo().equals(codigoContato)){
				descricao = tipoContato.getDescricao();
				break;
			}
		}
		return descricao;
	}

	public List<ContatoCliente> getListContatos() {
		if(listContatos == null){			
				listContatos = new ArrayList<ContatoCliente>();
		}
		return listContatos;
	}

	public void setListContatos(List<ContatoCliente> listContatos) {
		this.listContatos = listContatos;
	}

	public List<Cliente> getClientes() {
			clientes = clienteService.recuperaClientes();
		return clientes;
	}

	public void setClientes(List<Cliente> clientes) {
		this.clientes = clientes;
	}

	public Cliente getCliente() {
		 if(cliente == null)
			 cliente = new Cliente();
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Long getIdCliente() {
		return idCliente;
	}

	public void setIdCliente(Long idCliente) {
		this.idCliente = idCliente;
	}
	public void setContatoCliente(ContatoCliente contatoCliente) {
		this.contatoCliente = contatoCliente;
	}
	
	public List<TipoContatoEnun> getTiposContato() {
		
		return  Arrays.asList(TipoContatoEnun.values());
	}

	public String getTipoContato() {
		return tipoContato;
	}

	public void setTipoContato(String tipoContato) {
		this.tipoContato = tipoContato;
	}

	public List<TipoContatoEnun> getListTipoContato() {
		listTipoContato = Arrays.asList(TipoContatoEnun.values());
		
		return listTipoContato;
	}

	public void setListTipoContato(List<TipoContatoEnun> listTipoContato) {
		this.listTipoContato = listTipoContato;
	}
	
	public String getTipoCliente() {
		if(tipoCliente == null)
			tipoCliente = "1";
		return tipoCliente;
	}

	public void setTipoCliente(String tipoCliente) {
		this.tipoCliente = tipoCliente;
	}


	public List<Uf> getListUfs() {
		if(listUfs == null)
			listUfs = ufService.findAllUf();
		return listUfs;
	}

	public void setListUfs(List<Uf> listUfs) {
		this.listUfs = listUfs;
	}


	public Endereco getEndereco() {
		if(endereco == null)
			endereco = new Endereco();
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}


	public Uf getUfSelecionada() {
		return ufSelecionada;
	}


	public void setUfSelecionada(Uf ufSelecionada) {
		this.ufSelecionada = ufSelecionada;
	}


	public List<SelectItem> getListaUfs() {
		
		listUfs = ufService.findAllUf();
		listaUfs = new ArrayList<SelectItem>();
		for(Uf uf: listUfs){
			listaUfs.add(new SelectItem(uf.getCodUf(), uf.getSiglaUf()));
		}
		
		return listaUfs;
	}


	public void setListaUfs(List<SelectItem> listaUfs) {
		this.listaUfs = listaUfs;
	}


	public String getUf() {
		return uf;
	}


	public void setUf(String uf) {
		this.uf = uf;
	}
	
	
	
}
